package com.wtx.chapter01;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;

/**
 * @description: 客户端发送请求，服务端返回hello world
 *  channel: 通道,暂时可以理解为类似连接的东西
 *  channelHandler: 通道处理器,类似拦截器,处理channel中的内容
 *  pipeline: 管道,有多个channelHandler构成
 *  切记: 不要一开始陷入过多的细节,先让代码跑起来!
 * @author: wtx
 * @createDate: 2020/5/28
 */
public class TestServer {

    //几乎每一个netty的应用开发的流程都与如下代码类似
    //测试: http://localhost:8899/
    public static void main(String[] args) throws InterruptedException {

        // bossGroup、workerGroup含有的子线程个数(NioEventLoop)的个数
        // 默认为 cpu核数 * 2
        // 追踪源码: 发现默认的线程个数为 NettyRuntime.availableProcessors() * 2
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);     //接收连接
        EventLoopGroup workerGroup = new NioEventLoopGroup(8);   //处理连接

        try {
            ServerBootstrap serverBootstrap = new ServerBootstrap();    //netty用于简化服务器启动的类
            serverBootstrap.group(bossGroup,workerGroup).channel(NioServerSocketChannel.class)
                    .childHandler(new TestServerInitializer()); //指定子处理器

            ChannelFuture channelFuture = serverBootstrap.bind(8899).sync();
            channelFuture.channel().closeFuture().sync();
        }finally {
            //netty提供的优雅关闭线程组的方法
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}
